package cn.corffen.test.algorithm.leetcode.easy;

import java.util.Arrays;

/**
 * 给定两个有序整数数组 nums1 和 nums2，将 nums2 合并到 nums1 中，使得 num1 成为一个有序数组。
 * <p>
 * 说明:
 * <p>
 * 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
 * 你可以假设 nums1 有足够的空间（空间大小大于或等于 m + n）来保存 nums2 中的元素。
 * 示例:
 * <p>
 * 输入:
 * nums1 = [1,2,3,0,0,0], m = 3
 * nums2 = [2,5,6],       n = 3
 * <p>
 * 输出: [1,2,2,3,5,6]
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/merge-sorted-array
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Question88 {

    public static void main(String[] args) {

        Question88 solution = new Question88();
        int[] arr1 = new int[]{1, 3, 4, 5, 6, 0, 0, 0};
        int[] arr2 = new int[]{1, 2, 3};
        solution.merge(arr1, 5, arr2, arr2.length);
    }

    /**
     * 要注意m的大小不是nums1的长度
     *
     * @param nums1 有序数组,但是其长度为两个数组的长度之和
     * @param m     nums1的有序数的个数
     * @param nums2 有序数组
     * @param n     nums2的个数
     */
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        // Make a copy of nums1.
        int[] nums1_copy = new int[m];
        System.arraycopy(nums1, 0, nums1_copy, 0, m);

        // Two get pointers for nums1_copy and nums2.
        int p1 = 0;
        int p2 = 0;

        // Set pointer for nums1
        int p = 0;

        // Compare elements from nums1_copy and nums2
        // and add the smallest one into nums1.
        while ((p1 < m) && (p2 < n))
            nums1[p++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++];

        // if there are still elements to add
        if (p1 < m)
            System.arraycopy(nums1_copy, p1, nums1, p1 + p2, m + n - p1 - p2);
        if (p2 < n)
            System.arraycopy(nums2, p2, nums1, p1 + p2, m + n - p1 - p2);
        System.out.println(Arrays.toString(nums1));
    }

//    public int[] merge(int[] nums1, int m, int[] nums2, int n) {
//        int[] copyNums = new int[m];
//        System.arraycopy(nums1, 0, copyNums, 0, m);
//
//        int i = 0;
//        int j = 0;
//        int p = 0;
//        while (i < m && j < n) {
//            nums1[p++] = copyNums[i] < nums2[j] ? copyNums[i++] : nums2[j++];
//        }
//
//        if (i < m) {
//            System.arraycopy(copyNums, i, nums1, i + j, n + m - i - j);
//        }
//
//        if (j < n) {
//            System.arraycopy(nums2, j, nums1, i + j, n + m - i - j);
//        }
//
//        return nums1;
//    }
}
